package java_thinking.unit_15._15_10;

import java_thinking.unit_14.pets.Cat;
import java_thinking.unit_14.pets.Pet;

/**
 * @Description :   创建一个泛型类Generic1<T>,它只有一个方法，将接受一个T类型的参数。
 *                  创建第二个泛型类Generic2<T>，它也只有一个方法，将返回类型T的参数。
 *                  编写一个泛型方法，它具有一个调用第一个泛型类的方法的逆变参数。
 *                  编写第二个泛型方法，它具有一个调用第二个泛型类的方法的协变参数。
 * @author: cww
 * @DateTime: 2019-04-06 22:03
 */

public class E28 {
    class Generic1<T> {
        T t;
        void take(T t){
            this.t = t;
        }
    }
    class Generic2<T> {
        T t;
        T give() {
            return t;
        }
    }

    <T> void contra(Generic1<? super T> generic1,T item) {
        generic1.take(item);
    }
    <T> T co(Generic2<? extends T> generic2) {
        return generic2.give();
    }

    public static void main(String[] args) {
        E28 e28 = new E28();
        e28.contra(e28.new Generic1<Pet>(),new Cat("kitty"));
        e28.co(e28.new Generic2<>());
    }
}
